package com.founder.devwork.controller;

import com.founder.devwork.dto.res.DistributionStatsDTO;
import com.founder.devwork.dto.res.HourlyStatsDTO;
import com.founder.devwork.dto.res.MonthlyEngineerStatsDTO;
import com.founder.devwork.dto.res.MonthlyRepoStatsDTO;
import com.founder.devwork.dto.res.RepoAuthorStatsDTO;
import com.founder.devwork.dto.res.TopCommitterDTO;
import com.founder.devwork.dto.res.TopRepositoryDTO;
import com.founder.devwork.dto.res.WeeklyStatsDTO;
import com.founder.devwork.service.CommitLogService;
import com.founder.devwork.service.RepositoryService;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * GitLogAnalysisController 用于处理与 Git 日志分析相关的请求。
 * 提供各种统计信息和分析功能。
 */
@RestController
@RequestMapping("/api/gitlog")
@Slf4j
public class GitLogAnalysisController {

    /**
     * 提交日志服务。
     */
    @Autowired
    private CommitLogService commitLogService;

    /**
     * 仓库服务。
     */
    @Autowired
    private RepositoryService repositoryService;

    /**
     * 获取历史上的顶级提交者。
     * @param limitStr 限制条数
     * @param sortBy 排序字段
     * @param sortDirection 排序方向
     * @return 顶级提交者列表
     */
    @GetMapping("/stats/top-historical")
    public List<TopCommitterDTO> getTopHistorical(
        @RequestParam(defaultValue = "5") String limitStr,
        @RequestParam(required = false) String sortBy,
        @RequestParam(required = false) String sortDirection
    ) {
        int limit = "all".equalsIgnoreCase(limitStr) ? 0 : Integer.parseInt(limitStr);
        return commitLogService.getTopByCommitCount(limit, sortBy, sortDirection);
    }

    /**
     * 获取上个月内的顶级提交者。
     * @param limitStr 限制条数
     * @param sortBy 排序字段
     * @param sortDirection 排序方向
     * @return 顶级提交者列表
     */
    @GetMapping("/stats/top-last-month")
    public List<TopCommitterDTO> getTopLastMonth(
        @RequestParam(defaultValue = "5") String limitStr,
        @RequestParam(required = false) String sortBy,
        @RequestParam(required = false) String sortDirection
    ) {
        int limit = "all".equalsIgnoreCase(limitStr) ? 0 : Integer.parseInt(limitStr);
        return commitLogService.getTopLastMonthByCommitCount(limit, sortBy, sortDirection);
    }

    /**
     * 获取上个月内的顶级仓库。
     * @return 顶级仓库列表
     */
    @GetMapping("/stats/top-repos-last-month")
    public List<TopRepositoryDTO> getTopReposLastMonth() {
        return commitLogService.getTopLastMonthRepositoriesByChanges(10);
    }

    /**
     * 获取仓库的月度统计信息。
     * @param gitInstance Git 实例
     * @param repositoryId 仓库 ID
     * @return 月度统计信息列表
     */
    @GetMapping("/stats/repo-monthly")
    public List<MonthlyRepoStatsDTO> getRepoMonthlyStats(@RequestParam String gitInstance, @RequestParam String repositoryId) {
        return commitLogService.getMonthlyStatsForRepo(gitInstance, repositoryId);
    }

    /**
     * 获取工程师的月度统计信息。
     * @param engineerId 工程师 ID
     * @return 月度统计信息列表
     */
    @GetMapping("/stats/engineer-monthly")
    public List<MonthlyEngineerStatsDTO> getEngineerMonthlyStats(@RequestParam String engineerId) {
        return commitLogService.getMonthlyStatsForEngineer(engineerId);
    }

    /**
     * 获取每小时的统计信息。
     * @return 每小时统计信息列表
     */
    @GetMapping("/stats/hourly")
    public List<HourlyStatsDTO> getHourlyStats(@RequestParam(required = false) String engineerId) {
        return commitLogService.getHourlyStats(engineerId);
    }

    /**
     * 获取每周的统计信息。
     * @return 每周统计信息列表
     */
    @GetMapping("/stats/weekly")
    public List<WeeklyStatsDTO> getWeeklyStats(@RequestParam(required = false) String engineerId) {
        return commitLogService.getWeeklyStats(engineerId);
    }

    /**
     * 获取提交数量的分布统计。
     * @return 提交数量分布统计
     */
    @GetMapping("/stats/commit-distribution")
    public DistributionStatsDTO getCommitAmountDistribution() {
        return commitLogService.getCommitAmountDistribution();
    }

    /**
     * 获取每日工程师提交数量的分布统计。
     * @return 每日工程师提交数量分布统计
     */
    @GetMapping("/stats/daily-engineer-distribution")
    public DistributionStatsDTO getDailyEngineerAmountDistribution() {
        return commitLogService.getDailyEngineerAmountDistribution();
    }

    /**
     * 获取仓库的作者统计信息。
     * @param gitInstance Git 实例
     * @param repoId 仓库 ID
     * @param sortBy 排序字段
     * @param sortDirection 排序方向
     * @return 作者统计信息列表
     */
    @GetMapping("/stats/repo-authors")
    public List<RepoAuthorStatsDTO> getRepoAuthorsStats(
        @RequestParam String gitInstance,
        @RequestParam Long repoId,
        @RequestParam(required = false) String sortBy,
        @RequestParam(required = false) String sortDirection
    ) {
        return repositoryService.getRepoAuthorsStats(gitInstance, repoId, sortBy, sortDirection);
    }
}
